package com.cw.java8.functionInterface;

import java.util.function.*;

/**
 * Java 8 常 用 函 数 式 接 口
 * 函数式接口	入参参数类型	返回类型	抽象方法名	描 述	示例
 * Supplier	无	T	get	提供一个 T 类型的值	类似工厂方法
 * Consumer	T	void	accept	处理一个 T 类型的值	用作打印入参
 * Function<T, R>	T	R	apply	有一个 T 类型参数的函数	获取person的姓名
 * UnaryOperator	T	T	apply	类型 T 上的一元操作	对输入的数字自增
 * BinaryOperator	T,T	T	apply	类型 T 上的二元操作	对输入的两个数字相乘
 * Predicate	T	boolean	test	布尔值函数	判断person的年龄是否大于18
 */
public class Person {
    private String name;
    private Integer age;

    public Person(String name,Integer age){
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public static String print(String str){
        return "aaa"+str+"bbbb";
    }

    public static void main(String[] args) {
        // 返回个 Person 对象
        Supplier<Person> supplier = () -> new Person("旺财", 18);
        // 用作打印入参
        Consumer<String> consumer = s -> System.out.println(s);
        Consumer<String> consumer2 = s -> System.out.println(new Person("旺财", 18).print(s));
        // 获取 person 对象的名字
        Function<Person, String > function = person -> person.getName();
        // 输入的数字自增1
        UnaryOperator<Integer> unaryOperator = i -> ++i;
        // 输入的两个数字做乘法
        BinaryOperator<Integer> binaryOperator = (x, y) -> x * y;
        // 判断 person 对象的年龄是否大于18岁
        Predicate<Person> predicate = person -> person.getAge() > 18;

        Person person = new Person("旺财", 18);

        System.out.println("①Supplier        ==>生成 person 对象                ：" + supplier.get());
        System.out.print("②consumer        ==>打印入参                        ："); consumer.accept("莱纳，你坐啊");
        System.out.print("②consumer        ==>打印入参2                        ："); consumer2.accept("莱纳，你坐啊");

        System.out.println("③function        ==>获取 person 对象的姓名           ：" + function.apply(person));
        System.out.println("④unaryOperator   ==>输入的值自增1                    ：" + unaryOperator.apply(123456));
        System.out.println("⑤binaryOperator  ==>输入的两个值相乘                  ：" + binaryOperator.apply(1234, 5678));
        System.out.println("⑥predicate       ==>判断 person 对象年龄是否大于18岁   ：" + predicate.test(person));


        TestInterface testInterface = (a, b) -> a >= b ? a : b;
        Integer maxNum = testInterface.getMaxNum(255, 666);
        System.out.println("最大值 maxNum ：" + maxNum);

    }
}
